Form validation is an important part of any app.
In this article, we’ll look at how to use Vee-Validate 4 in our Vue 3 app for form validation.
required
The required
rule lets us validate that a value is entered into the input.
For example, we can write:
<template>
<Form @submit="onSubmit" v-slot="{ errors }">
<Field name="field" rules="required" />
<span>{{ errors.field }}</span>
</Form>
</template>
<script>
import { Form, Field, defineRule } from "vee-validate";
import * as rules from "@vee-validate/rules";
Object.keys(rules).forEach((rule) => {
defineRule(rule, rules[rule]);
});
export default {
components: {
Form,
Field,
},
methods: {
onSubmit(values) {
alert(JSON.stringify(values, null, 2));
},
},
};
</script>
Also, we can write:
<template>
<Form @submit="onSubmit" v-slot="{ errors }">
<Field name="field" :rules="validations" />
<span>{{ errors.field }}</span>
</Form>
</template>
<script>
import { Form, Field, defineRule } from "vee-validate";
import * as rules from "@vee-validate/rules";
Object.keys(rules).forEach((rule) => {
defineRule(rule, rules[rule]);
});
export default {
components: {
Form,
Field,
},
data() {
return {
validations: { required: true },
};
},
methods: {
onSubmit(values) {
alert(JSON.stringify(values, null, 2));
},
},
};
</script>
to add the rule with an object.
size
The size
rule lets us validate the file doesn’t exceed the given size in kilobytes.
For example, we can write:
<template>
<Form @submit="onSubmit" v-slot="{ errors }">
<Field name="field" type="file" rules="size:100" />
<span>{{ errors.field }}</span>
</Form>
</template>
<script>
import { Form, Field, defineRule } from "vee-validate";
import * as rules from "@vee-validate/rules";
Object.keys(rules).forEach((rule) => {
defineRule(rule, rules[rule]);
});
export default {
components: {
Form,
Field,
},
methods: {
onSubmit(values) {
alert(JSON.stringify(values, null, 2));
},
},
};
</script>
to validate that the selected file is less than 100 kilobytes.
Also, we can write:
<template>
<Form @submit="onSubmit" v-slot="{ errors }">
<Field name="field" type="file" :rules="validations" />
<span>{{ errors.field }}</span>
</Form>
</template>
<script>
import { Form, Field, defineRule } from "vee-validate";
import * as rules from "@vee-validate/rules";
Object.keys(rules).forEach((rule) => {
defineRule(rule, rules[rule]);
});
export default {
components: {
Form,
Field,
},
data() {
return {
validations: { size: 100 },
};
},
methods: {
onSubmit(values) {
alert(JSON.stringify(values, null, 2));
},
},
};
</script>
to add the same rule.
Global Message Generator
We can change how the validation messages are generated.
To do this, we write:
<template>
<Form @submit="onSubmit" v-slot="{ errors }">
<Field name="email" rules="required|email" />
<span>{{ errors.email }}</span>
</Form>
</template>
<script>
import { Form, Field, defineRule, configure } from "vee-validate";
import * as rules from "@vee-validate/rules";
Object.keys(rules).forEach((rule) => {
defineRule(rule, rules[rule]);
});
configure({
generateMessage: (context) => {
return `The field ${context.field} is invalid`;
},
});
export default {
components: {
Form,
Field,
},
data() {
return {
validations: { size: 100 },
};
},
methods: {
onSubmit(values) {
alert(JSON.stringify(values, null, 2));
},
},
};
</script>
We call the configure
method with the generateMessage
method to return the validation error message.
context
has the field data. context.field
has the field name.
So when we type in something other than an email address, we get The field email is invalid
displayed.
We can set the label
prop to set the value of context.field
to the value of the label
prop:
<template>
<Form @submit="onSubmit" v-slot="{ errors }">
<Field name="email" label="Email" rules="required|email" />
<span>{{ errors.email }}</span>
</Form>
</template>
<script>
import { Form, Field, defineRule, configure } from "vee-validate";
import * as rules from "@vee-validate/rules";
Object.keys(rules).forEach((rule) => {
defineRule(rule, rules[rule]);
});
configure({
generateMessage: (context) => {
return `The field ${context.field} is invalid`;
},
});
export default {
components: {
Form,
Field,
},
data() {
return {
validations: { size: 100 },
};
},
methods: {
onSubmit(values) {
alert(JSON.stringify(values, null, 2));
},
},
};
</script>
Now we see The field Email is invalid
when we type in something other than an email address.
Conclusion
We can validate required fields and selected file sizes with Vee-Validate 4 in our Vue 3 app.
Also, we configure Vee-Validate 4 to show the validation messages we want.